// 路由前置守卫
// 进行登录拦截的控制
import router from '@/router'
import store from '@/store'
// import { asyncRoutes } from '@/router' // 按需导入路由
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入一份进度条样式

// 定义白名单,所有的不受控制页面
const whiteList = ['/login', '/404']

// 导航前置守卫添加用户权限
// to:要去的组件
// from:从哪里来
// next:
// next()放行
// next(false)不放行
// next('地址') 放行且去对应的地址
// next({path:地址})
router.beforeEach(async(to, from, next) => {
  const token = store.getters.token
  // 判断有无token
  if (token) {
    //    有token,判断是否去登录页
    if (to.path === '/login') {
      next('/') // 跳到首页 (这是就是一个小的重定向, 如果访问有token访问login, 就拦截到首页)
      NProgress.done()
    } else {
      // await store.dispatch('user/getUserInfo')
      // console.log('将来权限控制', res)
      // 正常放行, 正常访问首页等内部页面, 需要获取用户信息
      // 如果当前vuex中已经有用户资料了, 就不需要再获取了 (没必要重复获取资料)
      // 获取用户信息
      if (!store.state.user.userInfo.userId) {
        // 没有id表示当前用户资料没有获取过, 就获取一下次
        const res = await store.dispatch('user/getUserInfo')

        // console.log(res.roles.menus) // 获取后台对应组织

        const otherRoutes = await store.dispatch('permission/filterRoutes', res.roles.menus)
        // console.log(otherRoutes)
        router.addRoutes([...otherRoutes,
          {
            path: '',
            redirect: './404',
            hidden: true
          }])
        // console.log('进行权限处理', res)
        // 目标:  1登录时,我们已经知道了用户有哪个标识
        // 2.根据这些标识过滤动态路由          [salaryRouter,socialRouter,attendanceRouter]
        // 3.过滤动态路由再添加到路由规则中     addRoutes()

        // router.addRoutes([路由对象{path:xxx,component:xxx},..])
        // 路由对象addRoutes添加新的路由规则
        // router.addRoutes(asyncRoutes) // 动态添加路由是异步的
        // next('' /dashboard '')  next({path:'/dashboard'})
        next({

          ...to, // next({ ...to })目的,是保证路由添加完了再进入页面
          replace: true // 重进一次, 不保留重复历史
        })
        return
      }
      next()
    }
    // 无token时
  } else {
    // 看在不在白名单中(免登陆即可访问的页面)
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
      NProgress.done() // 网页进度条加载完成后提示
    }
  }
})
// 后置守卫
router.afterEach((to, from) => {
  // 关闭进度条
  setTimeout(function() {
    NProgress.done()
  }, 500)
})
